/** 格式化数字保留指定的精度
 * @param { number | string} value 待转换的字符串或者数字
 * @param { number } digits 精度默认为2
 * @returns { number }  转换之后的结果，失败为0
 */
export const formateNumber = (value: number | string, digits: number = 2): number => {
    const waitChangeNumber = Number(value)
    if (!waitChangeNumber) {
        return 0
    }
    if (!digits && digits !== 0) {
        digits = 2
    }
    return Number(Number(waitChangeNumber).toFixed(Math.abs(digits)))
}
/**
 * 保留两位小数，只截取不四舍五入
 * @param {string | number} value 输入的数字或字符串
 * @returns {string} 处理后的字符串
 */
export const formatNumberToPrecision = (value: string | number): string => {
    const reg = value.toString().match(/^\d*(\.?\d{0,2})/g)
    return reg ? reg[0] : ''
}

/**
 * 精确计算两个数字的加减乘除，避免浮点数精度丢失
 * @param {number} num1 第一个数字
 * @param {number} num2 第二个数字
 * @param {string} symbol 运算符号（+ - * /）
 * @returns {string} 结果字符串
 */
export const performCalculation = (num1: number, num2: number, symbol: string = '+'): string => {
    let str1: string = num1.toString();
    let str2: string = num2.toString();
    let result: number;
    let str1Length: number = 0;
    let str2Length: number = 0;

    const getDecimalLength = (str: string) => {
        const decimalPart = str.split('.')[1];
        return decimalPart ? decimalPart.length : 0;
    };
    str1Length = getDecimalLength(str1);
    str2Length = getDecimalLength(str2);

    const step = Math.pow(10, Math.max(str1Length, str2Length));

    switch (symbol) {
        case "+":
            result = (num1 * step + num2 * step) / step;
            break;
        case "-":
            result = (num1 * step - num2 * step) / step;
            break;
        case "*":
            result = ((num1 * step) * (num2 * step)) / step / step;
            break;
        case "/":
            result = (num1 * step) / (num2 * step);
            break;
        default:
            result = 0;
            break;
    }
    return result.toString();
}

/**
 * 根据传递数字进行运算,并返回两位小数的数据（字符串类型）
 * @param {number} num1 第一个数字
 * @param {number} num2 第二个数字
 * @param {string} symbol 运算符号（+ - * /）
 * @returns {string} 结果字符串，保留两位小数
 */
export const calculateAndFormatToTwoDecimals  =(num1: number, num2: number, symbol: string = '+')=>formatNumberToPrecision(performCalculation(num1, num2, symbol))